﻿using System;

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class NodeTitleAttribute : Attribute {

    public string Value { get; }

    public NodeTitleAttribute(string value) {
        Value = value;
    }
}

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class LabelAttribute : Attribute {

    public string Value { get; }

    public LabelAttribute(string value) {
        Value = value;
    }
}

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class MaxWidthAttribute : Attribute {

    public int Value { get; }

    public MaxWidthAttribute(int value) {
        Value = value;
    }
}

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class WidthAttribute : Attribute {

    public int Value { get; }

    public WidthAttribute(int value) {
        Value = value;
    }
}

[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class HideInGuideAttribute : Attribute {
}

public abstract class NodeAcceptAttribute : Attribute {

    public Type Type { get; }

    public NodeAcceptAttribute(Type type) {
        Type = type;
    }
}

[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public sealed class NodeAcceptPrevAttribute : NodeAcceptAttribute {
    public NodeAcceptPrevAttribute(Type type) : base(type) {
    }
}

[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public sealed class NodeAcceptInputAttribute : NodeAcceptAttribute {
    public NodeAcceptInputAttribute(Type type) : base(type) {
    }
}

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class NodeHasNotInputAtrribute : Attribute {
}

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class NodeHasNotOutputAtrribute : Attribute {
}

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class AsEnumAttribute : Attribute {
}
